]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
app: Use better icon for wayland window-backed apps
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 23 Jan 2020 16:15:08 +0000 (17:15 +0100)
committerFlorian Müllner <florian.muellner@gmail.com>
Thu, 23 Jan 2020 18:25:28 +0000 (18:25 +0000)
For window-backed apps (read: windows we can't match to a .desktop
file), we use the window's icon property as icon. However there is
no such property on wayland (at least in the protocols we support),
so we end up with a blank actor in that case.

Do better than that, and pick a generic fallback icon instead.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1779

src/shell-app.c

index 5704f75b1c512537164ea6b33cb0e195495c1553..0d314bbb3c35b4209712652ea255750a225275b2 100644 (file)
@@ -186,7 +186,7 @@ window_backed_app_get_icon (ShellApp *app,
 {
   MetaWindow *window = NULL;
   StWidget *widget;
-  gint scale;
+  int scale, scaled_size;
   ShellGlobal *global;
   StThemeContext *context;
 
@@ -194,7 +194,7 @@ window_backed_app_get_icon (ShellApp *app,
   context = st_theme_context_get_for_stage (shell_global_get_stage (global));
   g_object_get (context, "scale-factor", &scale, NULL);
 
-  size *= scale;
+  scaled_size = size * scale;
 
   /* During a state transition from running to not-running for
    * window-backend apps, it's possible we get a request for the icon.
@@ -208,14 +208,28 @@ window_backed_app_get_icon (ShellApp *app,
       ClutterActor *actor;
 
       actor = clutter_actor_new ();
-      g_object_set (actor, "opacity", 0, "width", (float) size, "height", (float) size, NULL);
+      g_object_set (actor,
+                    "opacity", 0,
+                    "width", (float) scaled_size,
+                    "height", (float) scaled_size,
+                    NULL);
       return actor;
     }
 
-  widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
-                                                         G_OBJECT (window),
-                                                         "icon",
-                                                         size);
+  if (meta_window_get_client_type (window) == META_WINDOW_CLIENT_TYPE_X11)
+    {
+      widget = st_texture_cache_bind_cairo_surface_property (st_texture_cache_get_default (),
+                                                             G_OBJECT (window),
+                                                             "icon",
+                                                             scaled_size);
+    }
+  else
+    {
+      widget = g_object_new (ST_TYPE_ICON,
+                             "icon-size", size,
+                             "icon-name", "application-x-executable",
+                             NULL);
+    }
   st_widget_add_style_class_name (widget, "fallback-app-icon");
 
   return CLUTTER_ACTOR (widget);